import questionary
from typing import List, Optional, Tuple, Dict

from cli.models import AnalystType

ANALYST_ORDER = [
    ("市场分析师", AnalystType.MARKET),
    ("社交媒体分析师", AnalystType.SOCIAL),
    ("新闻分析师", AnalystType.NEWS),
    ("基本面分析师", AnalystType.FUNDAMENTALS),
]


def get_ticker() -> str:
    """提示用户输入股票代码。"""
    ticker = questionary.text(
        "输入要分析的股票代码:",
        validate=lambda x: len(x.strip()) > 0 or "请输入有效的股票代码。",
        style=questionary.Style(
            [
                ("text", "fg:green"),
                ("highlighted", "noinherit"),
            ]
        ),
    ).ask()

    if not ticker:
        console.print("\n[red]未提供股票代码。正在退出...[/red]")
        exit(1)

    return ticker.strip().upper()


def get_analysis_date() -> str:
    """提示用户输入 YYYY-MM-DD 格式的日期。"""
    import re
    from datetime import datetime

    def validate_date(date_str: str) -> bool:
        if not re.match(r"^\d{4}-\d{2}-\d{2}$", date_str):
            return False
        try:
            datetime.strptime(date_str, "%Y-%m-%d")
            return True
        except ValueError:
            return False

    date = questionary.text(
        "输入分析日期 (YYYY-MM-DD):",
        validate=lambda x: validate_date(x.strip())
        or "请输入有效的 YYYY-MM-DD 格式日期。",
        style=questionary.Style(
            [
                ("text", "fg:green"),
                ("highlighted", "noinherit"),
            ]
        ),
    ).ask()

    if not date:
        console.print("\n[red]未提供日期。正在退出...[/red]")
        exit(1)

    return date.strip()


def select_analysts() -> List[AnalystType]:
    """使用交互式复选框选择分析师。"""
    choices = questionary.checkbox(
        "选择您的 [分析师团队]:",
        choices=[
            questionary.Choice(display, value=value) for display, value in ANALYST_ORDER
        ],
        instruction="\n- 按空格键选择/取消选择分析师\n- 按 'a' 键全选/全不选\n- 完成后按 Enter 键",
        validate=lambda x: len(x) > 0 or "您必须至少选择一位分析师。",
        style=questionary.Style(
            [
                ("checkbox-selected", "fg:green"),
                ("selected", "fg:green noinherit"),
                ("highlighted", "noinherit"),
                ("pointer", "noinherit"),
            ]
        ),
    ).ask()

    if not choices:
        console.print("\n[red]未选择分析师。正在退出...[/red]")
        exit(1)

    return choices


def select_research_depth() -> int:
    """使用交互式选择来选择研究深度。"""

    # 定义研究深度选项及其对应的值
    DEPTH_OPTIONS = [
        ("浅层 - 快速研究，少量辩论和策略讨论回合", 1),
        ("中等 - 中等水平，适度的辩论和策略讨论回合", 3),
        ("深入 - 全面研究，深入的辩论和策略讨论", 5),
    ]

    choice = questionary.select(
        "选择您的 [研究深度]:",
        choices=[
            questionary.Choice(display, value=value) for display, value in DEPTH_OPTIONS
        ],
        instruction="\n- 使用箭头键导航\n- 按 Enter 键选择",
        style=questionary.Style(
            [
                ("selected", "fg:yellow noinherit"),
                ("highlighted", "fg:yellow noinherit"),
                ("pointer", "fg:yellow noinherit"),
            ]
        ),
    ).ask()

    if choice is None:
        console.print("\n[red]未选择研究深度。正在退出...[/red]")
        exit(1)

    return choice


def select_shallow_thinking_agent(provider) -> str:
    """使用交互式选择来选择快速思维 LLM 引擎。"""

    # 定义快速思维 LLM 引擎选项及其对应的模型名称
    SHALLOW_AGENT_OPTIONS = {
        "openai": [
            ("GPT-4o-mini - 快速高效，适用于快速任务", "gpt-4o-mini"),
            ("GPT-4.1-nano - 超轻量级模型，适用于基本操作", "gpt-4.1-nano"),
            ("GPT-4.1-mini - 紧凑型模型，性能良好", "gpt-4.1-mini"),
            ("GPT-4o - 标准模型，功能稳定", "gpt-4o"),
        ],
        "anthropic": [
            ("Claude Haiku 3.5 - 推理速度快，功能标准", "claude-3-5-haiku-latest"),
            ("Claude Sonnet 3.5 - 功能强大的标准模型", "claude-3-5-sonnet-latest"),
            ("Claude Sonnet 3.7 - 卓越的混合推理和智能体能力", "claude-3-7-sonnet-latest"),
            ("Claude Sonnet 4 - 高性能和出色的推理能力", "claude-sonnet-4-0"),
        ],
        "google": [
            ("Gemini 2.0 Flash-Lite - 成本效益高，延迟低", "gemini-2.0-flash-lite"),
            ("Gemini 2.0 Flash - 下一代功能、速度和思维", "gemini-2.0-flash"),
            ("Gemini 2.5 Flash - 自适应思维，成本效益高", "gemini-2.5-flash-preview-05-20"),
        ],
        "openrouter": [
            ("Meta: Llama 4 Scout (付费版) - 支持工具调用", "meta-llama/llama-4-scout:instruct"),
            ("OpenAI GPT-4o-mini - 支持工具调用", "openai/gpt-4o-mini"),
            ("Anthropic Claude 3.5 Sonnet - 支持工具调用", "anthropic/claude-3-5-sonnet"),
            ("Google Gemini 2.0 Flash - 支持工具调用", "google/gemini-2-0-flash"),
        ],
        "ollama": [
            ("llama3.1 本地版", "llama3.1"),
            ("llama3.2 本地版", "llama3.2"),
        ]
    }

    choice = questionary.select(
        "选择您的 [快速思维 LLM 引擎]:",
        choices=[
            questionary.Choice(display, value=value)
            for display, value in SHALLOW_AGENT_OPTIONS[provider.lower()]
        ],
        instruction="\n- 使用箭头键导航\n- 按 Enter 键选择",
        style=questionary.Style(
            [
                ("selected", "fg:magenta noinherit"),
                ("highlighted", "fg:magenta noinherit"),
                ("pointer", "fg:magenta noinherit"),
            ]
        ),
    ).ask()

    if choice is None:
        console.print(
            "\n[red]未选择快速思维 LLM 引擎。正在退出...[/red]"
        )
        exit(1)

    return choice


def select_deep_thinking_agent(provider) -> str:
    """使用交互式选择来选择深度思维 LLM 引擎。"""

    # 定义深度思维 LLM 引擎选项及其对应的模型名称
    DEEP_AGENT_OPTIONS = {
        "openai": [
            ("GPT-4.1-nano - 超轻量级模型，适用于基本操作", "gpt-4.1-nano"),
            ("GPT-4.1-mini - 紧凑型模型，性能良好", "gpt-4.1-mini"),
            ("GPT-4o - 标准模型，功能稳定", "gpt-4o"),
            ("o4-mini - 专业推理模型 (紧凑型)", "o4-mini"),
            ("o3-mini - 高级推理模型 (轻量级)", "o3-mini"),
            ("o3 - 完整高级推理模型", "o3"),
            ("o1 - 顶级推理和问题解决模型", "o1"),
        ],
        "anthropic": [
            ("Claude Haiku 3.5 - 推理速度快，功能标准", "claude-3-5-haiku-latest"),
            ("Claude Sonnet 3.5 - 功能强大的标准模型", "claude-3-5-sonnet-latest"),
            ("Claude Sonnet 3.7 - 卓越的混合推理和智能体能力", "claude-3-7-sonnet-latest"),
            ("Claude Sonnet 4 - 高性能和出色的推理能力", "claude-sonnet-4-0"),
            ("Claude Opus 4 - 最强大的 Anthropic 模型", "\tclaude-opus-4-0"),
        ],
        "google": [
            ("Gemini 2.0 Flash-Lite - 成本效益高，延迟低", "gemini-2.0-flash-lite"),
            ("Gemini 2.0 Flash - 下一代功能、速度和思维", "gemini-2.0-flash"),
            ("Gemini 2.5 Flash - 自适应思维，成本效益高", "gemini-2.5-flash-preview-05-20"),
            ("Gemini 2.5 Pro", "gemini-2.5-pro-preview-06-05"),
        ],
        "openrouter": [
            ("OpenAI GPT-4o - 强大的推理能力", "openai/gpt-4o"),
            ("Anthropic Claude 3.5 Sonnet - 优秀的推理能力", "anthropic/claude-3-5-sonnet"),
            ("Google Gemini 2.0 Flash - 快速推理", "google/gemini-2-0-flash"),
            ("Meta: Llama 4 Scout (付费版) - 支持工具调用", "meta-llama/llama-4-scout:instruct"),
        ],
        "ollama": [
            ("llama3.1 本地版", "llama3.1"),
            ("qwen3", "qwen3"),
        ]
    }
    
    choice = questionary.select(
        "选择您的 [深度思维 LLM 引擎]:",
        choices=[
            questionary.Choice(display, value=value)
            for display, value in DEEP_AGENT_OPTIONS[provider.lower()]
        ],
        instruction="\n- 使用箭头键导航\n- 按 Enter 键选择",
        style=questionary.Style(
            [
                ("selected", "fg:magenta noinherit"),
                ("highlighted", "fg:magenta noinherit"),
                ("pointer", "fg:magenta noinherit"),
            ]
        ),
    ).ask()

    if choice is None:
        console.print("\n[red]未选择深度思维 LLM 引擎。正在退出...[/red]")
        exit(1)

    return choice

def select_llm_provider() -> tuple[str, str]:
    """使用交互式选择来选择 OpenAI API URL。"""
    # 定义 OpenAI API 选项及其对应的端点
    BASE_URLS = [
        ("OpenAI", "https://api.openai.com/v1"),
        ("Anthropic", "https://api.anthropic.com/"),
        ("Google", "https://generativelanguage.googleapis.com/v1"),
        ("Openrouter", "https://openrouter.ai/api/v1"),
        ("Ollama", "http://localhost:11434/v1"),        
    ]
    
    choice = questionary.select(
        "选择您的 LLM 提供商:",
        choices=[
            questionary.Choice(display, value=(display, value))
            for display, value in BASE_URLS
        ],
        instruction="\n- 使用箭头键导航\n- 按 Enter 键选择",
        style=questionary.Style(
            [
                ("selected", "fg:magenta noinherit"),
                ("highlighted", "fg:magenta noinherit"),
                ("pointer", "fg:magenta noinherit"),
            ]
        ),
    ).ask()
    
    if choice is None:
        console.print("\n[red]未选择 OpenAI 后端。正在退出...[/red]")
        exit(1)
    
    display_name, url = choice
    print(f"您选择了: {display_name}\tURL: {url}")
    
    return display_name, url